IntroduciĂ³n

El presente archivo es un informe sobre el manejo de datos obtenidos por parte de la empresa ExelPitss. La infromacion que se nos fue proporcionada es realcionda con las diferentes solicitudes de trabajo, cada una de ellas cuenta con los datos de empresa necesario, modelos y las personas involucradas en la resolucion de la solicitud, pero, como dato principal se encontraban diferentes tipos de tiempos, desde tiempos de respuesta a la solucitud, hasta el tiempo que se necesito en la zona de trabajo para cumplir con los encargos. Tras el analisis exploratorio mediante la limpieza de los datos dados, se procedio a la busqeuda de un modelado del comportamieto en los tiempos de recepcion y tiempos limintes de respuesta, esto con el objetivo de presentar informacion relevante para la empresa y pudan tomar mejores decisiones a futuro, relacionadas con esta investigacion.

Desarrollo

GrĂ¡ficas del anĂ¡lisis exploratorio

Comparaciones del uso de los tiempos por los ingenieros en los estados de Jalisco y Nuevo LeĂ³n

Comparaciones por estado del tiempo que tomĂ³ responder una solicitud

GrĂ¡ficas por estado del tiempo que trabaja el ingeniero en el lugar que se solicitĂ³

GrĂ¡fica que muestra la relaciĂ³n entre el tiempo de respuesta y el lĂ­mite de tiempo restante, valores mĂ¡s altos del coeficiente significa que se usĂ³ mĂ¡s tiempo para solucionar el problema

GrĂ¡ficas de los estados en donde en promedio se usĂ³ mĂ¡s de la mitad del tiempo asignado para atender la solicitud. Pueden observarse casos en donde los valores son muy atĂ­picos, principalmente en casos de hace 2 o 3 años. TambiĂ©n hay casos como Puebla en donde una significativa cantidad de veces se usa mucho tiempo para atender una solicitud, puede deberse a que el ingeniero deba desplazarse desde otro estado o a factores externos.

GrĂ¡fica que muestra los estados en donde se usĂ³ mĂ¡s tiempo del asignado para resolver la solicitud, se puede observar que los excesos de tiempo son anteriores a agosto de 2019, sin embargo aĂºn los datos se encuentran de manera general por encima del 0.5

Estados en donde se necesitĂ³ en promedio la mitad o menos del tiempo asignado para responder una solicitud

Busqueda de correlaciones

La siguiente tabla nos muestra un comportamiento sencillo de las varaibles al interactuar entre si, esto con el proposito de darnos una idea general de las posibles correlaciones que podrĂ­an existir, y de esta forma asegurarnos que no fueran causadas por el azar. El primer analisis que decidimos realizar, para intentar observar alguna relacion posible con otro dato, fue en las ordenes de servicio que no fueron atendidas en el tiempo asignado.

Call:corr.test(x = correlacion_tiempos2_Fals, method = "spearman", 
    adjust = "none")
Correlation matrix 
                                Tiempo efectivo en sitio
Tiempo efectivo en sitio                             1.0
Tiempo de respuesta                                 -1.0
Limite tiempo de soluciĂ³n total                     -0.5
                                Tiempo de respuesta
Tiempo efectivo en sitio                       -1.0
Tiempo de respuesta                             1.0
Limite tiempo de soluciĂ³n total                 0.5
                                Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio                                   -0.5
Tiempo de respuesta                                         0.5
Limite tiempo de soluciĂ³n total                             1.0
Sample Size 
[1] 3
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
                                Tiempo efectivo en sitio
Tiempo efectivo en sitio                            0.00
Tiempo de respuesta                                 0.00
Limite tiempo de soluciĂ³n total                     0.67
                                Tiempo de respuesta
Tiempo efectivo en sitio                       0.00
Tiempo de respuesta                            0.00
Limite tiempo de soluciĂ³n total                0.67
                                Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio                                   0.67
Tiempo de respuesta                                        0.67
Limite tiempo de soluciĂ³n total                            0.00

 To see confidence intervals of the correlations, print with the short=FALSE option

Resultado de las correlaciones entre los tiempos, de las ordenes de servicio que fueron atendidas en el tiempo asignado

Call:corr.test(x = correlacion_tiempos2_True, method = "spearman", 
    adjust = "none")
Correlation matrix 
                                Tiempo efectivo en sitio
Tiempo efectivo en sitio                             1.0
Tiempo de respuesta                                 -0.5
Limite tiempo de soluciĂ³n total                     -1.0
                                Tiempo de respuesta
Tiempo efectivo en sitio                       -0.5
Tiempo de respuesta                             1.0
Limite tiempo de soluciĂ³n total                 0.5
                                Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio                                   -1.0
Tiempo de respuesta                                         0.5
Limite tiempo de soluciĂ³n total                             1.0
Sample Size 
[1] 3
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
                                Tiempo efectivo en sitio
Tiempo efectivo en sitio                            0.00
Tiempo de respuesta                                 0.67
Limite tiempo de soluciĂ³n total                     0.00
                                Tiempo de respuesta
Tiempo efectivo en sitio                       0.67
Tiempo de respuesta                            0.00
Limite tiempo de soluciĂ³n total                0.67
                                Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio                                   0.00
Tiempo de respuesta                                        0.67
Limite tiempo de soluciĂ³n total                            0.00

 To see confidence intervals of the correlations, print with the short=FALSE option

Las siguientes tablas contienen correlaciones especificas: LRespuesta_TRespuesta_Cor, que consta de las variables Tiempo de respuesta y Limite de tiempo de respuesta, en seguida estĂ¡ la columna Canvisitas_TRespuesta_Cor, que se constituye de las variablescant_visitas y Tiempo de respuesta. Las correlaciones se hacen con el modelo de Spearman, utilizando los datos que tienen un coeficiente de tiempo de respuesta y limite de tiempo de respuestas mayor o igual a 1 (eso quiere decir que utilizaron un mayor tiempo al asignado). Las 3 tablas no muestran correlaciones fiables o que podamos tomar como una correlaciĂ³n vĂ¡lida, en algunos casos esto se debe a la naturaleza de los mismos datos, adicional a esto, se puede ver que no existen correlaciones lineales entre las variables utilizadas.

Series de tiempo

components(dcmp_Jal) %>% autoplot()+ xlab("Meses")

components(dcmp_Jal_sem) %>% autoplot()+ xlab("Semanas")

Modelos

Train_tsb %>% 
  filter(Ruta == "JALISCO") %>% 
  features(Tiempo_de_respuesta,unitroot_kpss)
Train_tsb %>% 
  filter(Ruta == "JALISCO") %>% 
  features(Tiempo_de_respuesta, unitroot_ndiffs)

Train_tsb %>% 
  filter(Ruta == "JALISCO") %>% 
  features(Tiempo_de_respuesta, unitroot_nsdiffs)
Train_tsb %>% 
  filter(Ruta == "JALISCO") %>% 
  mutate(dif = difference(Tiempo_de_respuesta)) %>% 
  features(dif,unitroot_kpss)
Train_tsb %>% 
  filter(Ruta == "JALISCO") %>%
  mutate(Tiempo_de_respuesta = difference(Tiempo_de_respuesta, differences = 1)) %>% 
  gg_tsdisplay(plot_type = 'partial')

Modelos_fit %>% 
  select(ARIMA_fourier2) %>% 
  report()
Series: Tiempo_de_respuesta 
Model: LM w/ ARIMA(2,1,0) errors 

Coefficients:
          ar1      ar2  fourier(K = 2)C1_52  fourier(K = 2)S1_52
      -0.4756  -0.3693               0.2428               -0.052
s.e.   0.0783   0.0778               0.1858                0.181
      fourier(K = 2)C2_52  fourier(K = 2)S2_52
                   0.0564              -0.0241
s.e.               0.0925               0.0935

sigma^2 estimated as 0.1191:  log likelihood=-47.19
AIC=108.39   AICc=109.23   BIC=129.03

Grafica del test de los modelos

Modelos_fc %>% 
  # filter(.model == "ARIMA_fourier2") %>% 
  # autoplot(filter_index(Train_tsb, "2020-01-01" ~ "2020-12-06")) +
  autoplot(filter_index(Train_tsb, "2020-01-01" ~ "2020-12-06"), level = NULL) +
  ggtitle("Entrenamiento") +
  xlab("Años") + ylab("horas") +
  guides(colour=guide_legend(title="Forecast"))+
   geom_vline(xintercept = as.Date("2020-11-08"), color = "Red",
              linetype = "dashed")+
  annotate("label", x = c(as.Date("2020-08-01"),as.Date("2020-12-01")),
                        y = 3.5, label = c("Train set", "Test set"),
                        color = c("black","blue"))
Error: Provided data contains a different key structure to the forecasts.
Run `rlang::last_error()` to see where the error occurred.

Analisis estadistico de los modelos

Bibliografia / Referencias

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyB5IE1vZGVsb3MiDQpzdWJ0aXRsZTogIkluZm9ybWUgZGUgbG9zIHRpZW1wb3MgZGUgcmVjZXBjacOzbiB5IHRpZW1wbyBsaW1pdGUgZGUgcmVzcHVlc3RhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgSW50cm9kdWNpw7NuIA0KDQpFbCBwcmVzZW50ZSBhcmNoaXZvIGVzIHVuIGluZm9ybWUgc29icmUgZWwgbWFuZWpvIGRlIGRhdG9zIG9idGVuaWRvcyBwb3IgcGFydGUgZGUgbGEgZW1wcmVzYSAqKkV4ZWxQaXRzcyoqLiANCkxhIGluZnJvbWFjaW9uIHF1ZSBzZSBub3MgZnVlIHByb3BvcmNpb25hZGEgZXMgcmVhbGNpb25kYSBjb24gbGFzIGRpZmVyZW50ZXMgc29saWNpdHVkZXMgZGUgdHJhYmFqbywgY2FkYSB1bmEgZGUgZWxsYXMgY3VlbnRhIGNvbiBsb3MgZGF0b3MgZGUgZW1wcmVzYSBuZWNlc2FyaW8sIG1vZGVsb3MgeSBsYXMgcGVyc29uYXMgaW52b2x1Y3JhZGFzIGVuIGxhIHJlc29sdWNpb24gZGUgbGEgc29saWNpdHVkLCBwZXJvLCBjb21vIGRhdG8gcHJpbmNpcGFsIHNlIGVuY29udHJhYmFuIGRpZmVyZW50ZXMgdGlwb3MgZGUgdGllbXBvcywgZGVzZGUgdGllbXBvcyBkZSByZXNwdWVzdGEgYSBsYSBzb2x1Y2l0dWQsIGhhc3RhIGVsIHRpZW1wbyBxdWUgc2UgbmVjZXNpdG8gZW4gbGEgem9uYSBkZSB0cmFiYWpvIHBhcmEgY3VtcGxpciBjb24gbG9zIGVuY2FyZ29zLg0KVHJhcyBlbCBhbmFsaXNpcyBleHBsb3JhdG9yaW8gbWVkaWFudGUgbGEgbGltcGllemEgZGUgbG9zIGRhdG9zIGRhZG9zLCBzZSBwcm9jZWRpbyBhIGxhIGJ1c3FldWRhIGRlIHVuIG1vZGVsYWRvIGRlbCBjb21wb3J0YW1pZXRvIGVuIGxvcyB0aWVtcG9zIGRlIHJlY2VwY2lvbiB5IHRpZW1wb3MgbGltaW50ZXMgZGUgcmVzcHVlc3RhLCBlc3RvIGNvbiBlbCBvYmpldGl2byBkZSBwcmVzZW50YXIgaW5mb3JtYWNpb24gcmVsZXZhbnRlIHBhcmEgbGEgZW1wcmVzYSB5IHB1ZGFuIHRvbWFyIG1lam9yZXMgZGVjaXNpb25lcyBhIGZ1dHVybywgcmVsYWNpb25hZGFzIGNvbiBlc3RhIGludmVzdGlnYWNpb24uDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0Kc291cmNlKCJMaW1waWV6YS5SIiwgDQogICAgICAgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSwNCiAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIpDQpzb3VyY2UoImxpbXBpZXphX3JlcG9ydGVfVGllbXBvX3Jlc3B1ZXN0YS5SIiwgDQogICAgICAgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSwNCiAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIpDQpzb3VyY2UoIk1vZGVsb3MuUiIsIA0KICAgICAgIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCksDQogICAgICAgZW5jb2RpbmcgPSAidXRmLTgiKQ0KYGBgDQoNCg0KDQojIERlc2Fycm9sbG8gDQojIyBHcsOhZmljYXMgZGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8NCmBgYHtyIGVjaG89RkFMU0V9DQp0aWVtcG9zX29zX3RpZHlfdGJsICU+JQ0KICBmaWx0ZXIoUnV0YSA9PSAiSkFMSVNDTyIsDQogICAgICAgICBUaWVtcG9zICVpbiUgYygiVGllbXBvIGVmZWN0aXZvIGVuIHNpdGlvIiwgIlRpZW1wbyBkZSByZXNwdWVzdGEiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGBUw6ljbmljbyBkZSB2aXNpdGFgLCB5ID0gaG9yYV9kZWNpbWFsLCBmaWxsID0gVGllbXBvcykpKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGZhY2V0X2dyaWQoUnV0YSB+IFRpZW1wb3MsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZ3RpdGxlKCJBbmFsaXNpcyBkZSBsb3MgdGVjbmljb3MgZGUgdmlzaXN0YSB5IHN1cyB0aWVtcG9zIGRlIHJlc3B1ZXN0YSIpKw0KICBjb29yZF9mbGlwKCkNCg0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0aWVtcG9zX29zX3RpZHlfdGJsICU+JQ0KICBmaWx0ZXIoVGllbXBvcyAlaW4lIGMoIlRpZW1wbyBlZmVjdGl2byBlbiBzaXRpbyIsICJUaWVtcG8gZGUgcmVzcHVlc3RhIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBSdXRhLCB5ID0gaG9yYV9kZWNpbWFsLCBmaWxsID0gVGllbXBvcykpKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGZhY2V0X3dyYXAofiBUaWVtcG9zLCBzY2FsZXMgPSAiZnJlZV94IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiQW5hbGlzaXMgZGUgbG9zIHRpZW1wb3MgZGUgcmVzcHVlc3RhIGRlIGxhcyBydXRhcyIpKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KcGxvdGx5OjpnZ3Bsb3RseShDb21wX0phbF9OTCkNCmBgYA0KQ29tcGFyYWNpb25lcyBkZWwgdXNvIGRlIGxvcyB0aWVtcG9zIHBvciBsb3MgaW5nZW5pZXJvcyBlbiBsb3MgZXN0YWRvcyBkZSBKYWxpc2NvIHkgTnVldm8gTGXDs24NCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoVFJfcnV0YSkNCmBgYA0KQ29tcGFyYWNpb25lcyBwb3IgZXN0YWRvIGRlbCB0aWVtcG8gcXVlIHRvbcOzIHJlc3BvbmRlciB1bmEgc29saWNpdHVkDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KFRFX3J1dGEpDQpgYGANCkdyw6FmaWNhcyBwb3IgZXN0YWRvIGRlbCB0aWVtcG8gcXVlIHRyYWJhamEgZWwgaW5nZW5pZXJvIGVuIGVsIGx1Z2FyIHF1ZSBzZSBzb2xpY2l0w7MNCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoUGVyUl9ydXRhKQ0KYGBgDQpHcsOhZmljYSBxdWUgbXVlc3RyYSBsYSByZWxhY2nDs24gZW50cmUgZWwgdGllbXBvIGRlIHJlc3B1ZXN0YSB5IGVsIGzDrW1pdGUgZGUgdGllbXBvIHJlc3RhbnRlLCB2YWxvcmVzIG3DoXMgYWx0b3MgZGVsIGNvZWZpY2llbnRlIHNpZ25pZmljYSBxdWUgc2UgdXPDsyBtw6FzIHRpZW1wbyBwYXJhIHNvbHVjaW9uYXIgZWwgcHJvYmxlbWENCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoY29jaWVudGVfcnV0YSkNCmBgYA0KR3LDoWZpY2FzIGRlIGxvcyBlc3RhZG9zIGVuIGRvbmRlIGVuIHByb21lZGlvIHNlIHVzw7MgbcOhcyBkZSBsYSBtaXRhZCBkZWwgdGllbXBvIGFzaWduYWRvIHBhcmEgYXRlbmRlciBsYSBzb2xpY2l0dWQuIFB1ZWRlbiBvYnNlcnZhcnNlIGNhc29zIGVuIGRvbmRlIGxvcyB2YWxvcmVzIHNvbiBtdXkgYXTDrXBpY29zLCBwcmluY2lwYWxtZW50ZSBlbiBjYXNvcyBkZSBoYWNlIDIgbyAzIGHDsW9zLiBUYW1iacOpbiBoYXkgY2Fzb3MgY29tbyBQdWVibGEgZW4gZG9uZGUgdW5hIHNpZ25pZmljYXRpdmEgY2FudGlkYWQgZGUgdmVjZXMgc2UgdXNhIG11Y2hvIHRpZW1wbyBwYXJhIGF0ZW5kZXIgdW5hIHNvbGljaXR1ZCwgcHVlZGUgZGViZXJzZSBhIHF1ZSBlbCBpbmdlbmllcm8gZGViYSBkZXNwbGF6YXJzZSBkZXNkZSBvdHJvIGVzdGFkbyBvIGEgZmFjdG9yZXMgZXh0ZXJub3MuDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KEVUX3J1dGEpDQoNCmBgYA0KR3LDoWZpY2EgcXVlIG11ZXN0cmEgbG9zIGVzdGFkb3MgZW4gZG9uZGUgc2UgdXPDsyBtw6FzIHRpZW1wbyBkZWwgYXNpZ25hZG8gcGFyYSByZXNvbHZlciBsYSBzb2xpY2l0dWQsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsb3MgZXhjZXNvcyBkZSB0aWVtcG8gc29uIGFudGVyaW9yZXMgYSBhZ29zdG8gZGUgMjAxOSwgc2luIGVtYmFyZ28gYcO6biBsb3MgZGF0b3Mgc2UgZW5jdWVudHJhbiBkZSBtYW5lcmEgZ2VuZXJhbCBwb3IgZW5jaW1hIGRlbCAwLjUNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KFRPX3J1dGEpDQpgYGANCkVzdGFkb3MgZW4gZG9uZGUgc2UgbmVjZXNpdMOzIGVuIHByb21lZGlvIGxhIG1pdGFkIG8gbWVub3MgZGVsIHRpZW1wbyBhc2lnbmFkbyBwYXJhIHJlc3BvbmRlciB1bmEgc29saWNpdHVkDQoNCiMjIEJ1c3F1ZWRhIGRlIGNvcnJlbGFjaW9uZXMgDQoNCkxhIHNpZ3VpZW50ZSB0YWJsYSBub3MgbXVlc3RyYSB1biBjb21wb3J0YW1pZW50byBzZW5jaWxsbyBkZSBsYXMgdmFyYWlibGVzIGFsIGludGVyYWN0dWFyIGVudHJlIHNpLCBlc3RvIGNvbiBlbCBwcm9wb3NpdG8gZGUgZGFybm9zIHVuYSBpZGVhIGdlbmVyYWwgZGUgbGFzIHBvc2libGVzIGNvcnJlbGFjaW9uZXMgcXVlIHBvZHLDrWFuIGV4aXN0aXIsICB5IGRlIGVzdGEgZm9ybWEgYXNlZ3VyYXJub3MgcXVlIG5vIGZ1ZXJhbiBjYXVzYWRhcyBwb3IgZWwgYXphci4gDQpFbCBwcmltZXIgYW5hbGlzaXMgcXVlIGRlY2lkaW1vcyByZWFsaXphciwgcGFyYSBpbnRlbnRhciBvYnNlcnZhciBhbGd1bmEgcmVsYWNpb24gcG9zaWJsZSBjb24gb3RybyBkYXRvLCBmdWUgZW4gbGFzIG9yZGVuZXMgZGUgc2VydmljaW8gcXVlIG5vIGZ1ZXJvbiBhdGVuZGlkYXMgZW4gZWwgdGllbXBvIGFzaWduYWRvLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9DQoNCnBhaXJzLnBhbmVscyhjb3JyZWxhY2lvbl90aWVtcG9zMV9GYWxzLCBtZXRob2QgPSAic3BlYXJtYW4iKQ0KZ2djb3JycGxvdChjb3JyZWxhY2lvbl90aWVtcG9zMl9GYWxzLG1ldGhvZCA9ICdjaXJjbGUnLCB0eXBlID0gJ2xvd2VyJyxsYWIgPSBUUlVFKSsNCiAgZ2d0aXRsZSgiTWF0cml6IGRlIGNvcnJlbGFjacOzbiIpKw0KICB0aGVtZV9taW5pbWFsKCkNCmNvcnIudGVzdChjb3JyZWxhY2lvbl90aWVtcG9zMl9GYWxzLCBtZXRob2QgPSAic3BlYXJtYW4iLCBhZGp1c3QgPSAibm9uZSIpDQpgYGANClJlc3VsdGFkbyBkZSBsYXMgY29ycmVsYWNpb25lcyBlbnRyZSBsb3MgdGllbXBvcywgZGUgbGFzIG9yZGVuZXMgZGUgc2VydmljaW8gcXVlIGZ1ZXJvbiBhdGVuZGlkYXMgZW4gZWwgdGllbXBvIGFzaWduYWRvIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KcGFpcnMucGFuZWxzKGNvcnJlbGFjaW9uX3RpZW1wb3MxX1RydWUsIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQpnZ2NvcnJwbG90KGNvcnJlbGFjaW9uX3RpZW1wb3MyX1RydWUsbWV0aG9kID0gJ2NpcmNsZScsIHR5cGUgPSAnbG93ZXInLGxhYiA9IFRSVUUpKw0KICBnZ3RpdGxlKCJNYXRyaXogZGUgY29ycmVsYWNpw7NuIikrDQogIHRoZW1lX21pbmltYWwoKQ0KY29yci50ZXN0KGNvcnJlbGFjaW9uX3RpZW1wb3MyX1RydWUsIG1ldGhvZCA9ICJzcGVhcm1hbiIsIGFkanVzdCA9ICJub25lIikNCmBgYA0KDQpMYXMgc2lndWllbnRlcyB0YWJsYXMgY29udGllbmVuIGNvcnJlbGFjaW9uZXMgZXNwZWNpZmljYXM6ICAqKkxSZXNwdWVzdGFfVFJlc3B1ZXN0YV9Db3IqKiwgcXVlIGNvbnN0YSBkZSBsYXMgdmFyaWFibGVzIGBUaWVtcG8gZGUgcmVzcHVlc3RhYCB5IGBMaW1pdGUgZGUgdGllbXBvIGRlIHJlc3B1ZXN0YWAsIGVuIHNlZ3VpZGEgZXN0w6EgbGEgY29sdW1uYSAgKipDYW52aXNpdGFzX1RSZXNwdWVzdGFfQ29yKiosIHF1ZSBzZSBjb25zdGl0dXllIGRlIGxhcyB2YXJpYWJsZXNgY2FudF92aXNpdGFzYCB5IGBUaWVtcG8gZGUgcmVzcHVlc3RhYC4gTGFzIGNvcnJlbGFjaW9uZXMgc2UgaGFjZW4gY29uIGVsIG1vZGVsbyBkZSAqU3BlYXJtYW4qLCB1dGlsaXphbmRvIGxvcyBkYXRvcyBxdWUgdGllbmVuIHVuIGNvZWZpY2llbnRlIGRlIHRpZW1wbyBkZSByZXNwdWVzdGEgeSBsaW1pdGUgZGUgdGllbXBvIGRlIHJlc3B1ZXN0YXMgbWF5b3IgbyBpZ3VhbCBhIDEgKGVzbyBxdWllcmUgZGVjaXIgcXVlIHV0aWxpemFyb24gdW4gbWF5b3IgdGllbXBvIGFsIGFzaWduYWRvKS4NCkxhcyAzIHRhYmxhcyBubyBtdWVzdHJhbiBjb3JyZWxhY2lvbmVzIGZpYWJsZXMgbyBxdWUgcG9kYW1vcyB0b21hciBjb21vIHVuYSBjb3JyZWxhY2nDs24gdsOhbGlkYSwgZW4gYWxndW5vcyBjYXNvcyBlc3RvIHNlIGRlYmUgYSBsYSBuYXR1cmFsZXphIGRlIGxvcyBtaXNtb3MgZGF0b3MsIGFkaWNpb25hbCBhIGVzdG8sIHNlIHB1ZWRlIHZlciBxdWUgbm8gZXhpc3RlbiBjb3JyZWxhY2lvbmVzIGxpbmVhbGVzIGVudHJlIGxhcyB2YXJpYWJsZXMgdXRpbGl6YWRhcy4gDQoNCg0KIyMgU2VyaWVzIGRlIHRpZW1wbw0KYGBge3J9DQpjb21wb25lbnRzKGRjbXBfSmFsKSAlPiUgYXV0b3Bsb3QoKSsgeGxhYigiTWVzZXMiKQ0KYGBgDQoNCmBgYHtyfQ0KY29tcG9uZW50cyhkY21wX0phbF9zZW0pICU+JSBhdXRvcGxvdCgpKyB4bGFiKCJTZW1hbmFzIikNCmBgYA0KDQoNCiMjIE1vZGVsb3MgDQoNCmBgYHtyfQ0KVHJhaW5fdHNiICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUgDQogIGZlYXR1cmVzKFRpZW1wb19kZV9yZXNwdWVzdGEsdW5pdHJvb3Rfa3BzcykNCmBgYA0KDQpgYGB7cn0NClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcihSdXRhID09ICJKQUxJU0NPIikgJT4lIA0KICBmZWF0dXJlcyhUaWVtcG9fZGVfcmVzcHVlc3RhLCB1bml0cm9vdF9uZGlmZnMpDQoNClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcihSdXRhID09ICJKQUxJU0NPIikgJT4lIA0KICBmZWF0dXJlcyhUaWVtcG9fZGVfcmVzcHVlc3RhLCB1bml0cm9vdF9uc2RpZmZzKQ0KYGBgDQoNCg0KYGBge3J9DQpUcmFpbl90c2IgJT4lIA0KICBmaWx0ZXIoUnV0YSA9PSAiSkFMSVNDTyIpICU+JSANCiAgbXV0YXRlKGRpZiA9IGRpZmZlcmVuY2UoVGllbXBvX2RlX3Jlc3B1ZXN0YSkpICU+JSANCiAgZmVhdHVyZXMoZGlmLHVuaXRyb290X2twc3MpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVHJhaW5fdHNiICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUNCiAgbXV0YXRlKFRpZW1wb19kZV9yZXNwdWVzdGEgPSBkaWZmZXJlbmNlKFRpZW1wb19kZV9yZXNwdWVzdGEsIGRpZmZlcmVuY2VzID0gMSkpICU+JSANCiAgZ2dfdHNkaXNwbGF5KHBsb3RfdHlwZSA9ICdwYXJ0aWFsJykNCmBgYA0KDQpgYGB7cn0NCk1vZGVsb3NfZml0ICU+JSANCiAgc2VsZWN0KEFSSU1BX2ZvdXJpZXIyKSAlPiUgDQogIHJlcG9ydCgpDQpgYGANCg0KDQoNCkdyYWZpY2EgZGVsIHRlc3QgZGUgbG9zIG1vZGVsb3MNCg0KDQpgYGB7cn0NCk1vZGVsb3NfZmMgJT4lIA0KICAjIGZpbHRlcigubW9kZWwgPT0gIkFSSU1BX2ZvdXJpZXIyIikgJT4lIA0KICAjIGF1dG9wbG90KGZpbHRlcl9pbmRleChUcmFpbl90c2IsICIyMDIwLTAxLTAxIiB+ICIyMDIwLTEyLTA2IikpICsNCiAgYXV0b3Bsb3QoZmlsdGVyX2luZGV4KFRyYWluX3RzYiwgIjIwMjAtMDEtMDEiIH4gIjIwMjAtMTItMDYiKSwgbGV2ZWwgPSBOVUxMKSArDQogIGdndGl0bGUoIkVudHJlbmFtaWVudG8iKSArDQogIHhsYWIoIkHDsW9zIikgKyB5bGFiKCJob3JhcyIpICsNCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IkZvcmVjYXN0IikpKw0KICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMS0wOCIpLCBjb2xvciA9ICJSZWQiLA0KICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSsNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IGMoYXMuRGF0ZSgiMjAyMC0wOC0wMSIpLGFzLkRhdGUoIjIwMjAtMTItMDEiKSksDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gMy41LCBsYWJlbCA9IGMoIlRyYWluIHNldCIsICJUZXN0IHNldCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJibGFjayIsImJsdWUiKSkNCmBgYA0KDQpgYGB7cn0NClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcl9pbmRleCgiMjAyMC0wMS0wMSIgfiAiMjAyMC0xMi0wNiIpICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUgDQogIGF1dG9wbG90KFRpZW1wb19kZV9yZXNwdWVzdGEpICsgDQogIGF1dG9sYXllcihNb2RlbG9zX2ZjICU+JSBmaWx0ZXIoLm1vZGVsID09ICJkeW5hbWljX3JlZyIpLCBsZXZlbCA9IE5VTEwpDQpgYGANCg0KDQpgYGB7cn0NCk1vZGVsb3NfZmMgJT4lIA0KICBmaWx0ZXIoLm1vZGVsICVpbiUgYygiZHluYW1pY19yZWciKSkgJT4lIA0KICBhdXRvcGxvdChmaWx0ZXJfaW5kZXgoVHJhaW5fdHNiLCAiMjAyMC0wMS0wMSIgfiAiMjAyMC0xMi0wNiIpKSArDQogICMgYXV0b3Bsb3QoZmlsdGVyX2luZGV4KFRyYWluX3RzYiwgIjIwMjAtMDEtMDEiIH4gIjIwMjAtMTItMDYiKSwgbGV2ZWwgPSBOVUxMKSArDQogIGdndGl0bGUoIkVudHJlbmFtaWVudG8iKSArDQogIHhsYWIoIkHDsW9zIikgKyB5bGFiKCJob3JhcyIpICsNCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IkZvcmVjYXN0IikpKw0KICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMS0wOCIpLCBjb2xvciA9ICJSZWQiLA0KICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSsNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IGMoYXMuRGF0ZSgiMjAyMC0wOC0wMSIpLGFzLkRhdGUoIjIwMjAtMTItMDEiKSksDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gMy41LCBsYWJlbCA9IGMoIlRyYWluIHNldCIsICJUZXN0IHNldCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJibGFjayIsImJsdWUiKSkNCmBgYA0KDQoNCkFuYWxpc2lzIGVzdGFkaXN0aWNvIGRlIGxvcyBtb2RlbG9zICANCg0KDQpgYGB7cn0NCkVycm9yX3Rlc3QgJT4lIA0KICBzZWxlY3QoLm1vZGVsOi50eXBlLCBSTVNFLCBNQUUsIE1BUEUsIE1BU0UpICU+JSANCiAgYXJyYW5nZShSTVNFKQ0KYGBgDQoNCg0KDQojIEJpYmxpb2dyYWZpYSAvIFJlZmVyZW5jaWFzIA0KDQoNCiogTGVuZ3VhamUgZGUgcHJvZ3JhbWFjaW9uOg0KICBodHRwczovL3d3dy5yLXByb2plY3Qub3JnDQogIC8NCiogQW1iaWVudGUgZGUgcHJvZ3JhbWFjaW9uOg0KICBodHRwczovL3JzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvDQoNCiogUGFnaW5hIGRlIGluaWNpbyBkZSBlc3R1ZGlvcw0KICBodHRwczovL3I0ZHMtZW4tZXNwYW5pb2wubmV0bGlmeS5hcHANCg0KKiBQcmluY2lwaW9zIGJhc2ljb3MgZGUgbGFzIHNlcmllcyBkZSB0aWVtcG8NCiAgaHR0cHM6Ly9ib29rZG93bi5vcmcvY29udGVudC8yMjc0L3Nlcmllcy10ZW1wb3JhbGVzLmh0bWwNCiAgaHR0cHM6Ly9vdGV4dHMuY29tL2ZwcDIvDQoNCiogQXl1ZGEgZGUgbW9kZWxvcyBlbiBSDQogIGh0dHBzOi8vZ2l0aHViLmNvbS90aWR5bW9kZWxzDQogIGh0dHBzOi8vd3d3LnRpZHltb2RlbHMub3JnLw0KICAgIA0K